package com.zr.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类，定义交换机、队列和绑定关系
 */
@Configuration
public class RabbitMQConfig {

    // 交换机名称
    @Value("${rabbitmq.exchange.direct}")
    private String directExchange;
    
    @Value("${rabbitmq.exchange.topic}")
    private String topicExchange;
    
    // 队列名称
    @Value("${rabbitmq.queue.sms}")
    private String smsQueue;
    
    @Value("${rabbitmq.queue.email}")
    private String emailQueue;
    
    @Value("${rabbitmq.queue.notice}")
    private String noticeQueue;
    
    // 路由键
    @Value("${rabbitmq.routing.sms}")
    private String smsRoutingKey;
    
    @Value("${rabbitmq.routing.email}")
    private String emailRoutingKey;
    
    @Value("${rabbitmq.routing.notice}")
    private String noticeRoutingKey;

    /**
     * 声明直接交换机
     */
    @Bean
    public DirectExchange directExchange() {
        // durable:是否持久化,默认是false,持久化交换机将在服务器重启后继续存在
        // autoDelete:是否自动删除,交换机在所有绑定队列都被删除后自动删除
        // exclusive:是否排他,如果一个交换机被声明为排他的,该交换机仅对首次声明它的连接可见
        return ExchangeBuilder.directExchange(directExchange)
                .durable(true)
                .build();
    }

    /**
     * 声明主题交换机
     */
    @Bean
    public TopicExchange topicExchange() {
        return ExchangeBuilder.topicExchange(topicExchange)
                .durable(true)
                .build();
    }

    /**
     * 声明短信队列
     */
    @Bean
    public Queue smsQueue() {
        // durable:是否持久化,默认是false,持久化队列会将消息持久化到磁盘
        // exclusive:是否排他,如果一个队列被声明为排他的,该队列仅对首次声明它的连接可见
        // autoDelete:是否自动删除,队列在没有消费者连接的情况下自动删除
        return QueueBuilder.durable(smsQueue)
                .build();
    }

    /**
     * 声明邮件队列
     */
    @Bean
    public Queue emailQueue() {
        return QueueBuilder.durable(emailQueue)
                .build();
    }

    /**
     * 声明通知队列
     */
    @Bean
    public Queue noticeQueue() {
        return QueueBuilder.durable(noticeQueue)
                .build();
    }

    /**
     * 绑定短信队列到直接交换机
     */
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue())
                .to(directExchange())
                .with(smsRoutingKey);
    }

    /**
     * 绑定邮件队列到直接交换机
     */
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue())
                .to(directExchange())
                .with(emailRoutingKey);
    }

    /**
     * 绑定通知队列到主题交换机
     */
    @Bean
    public Binding noticeBinding() {
        return BindingBuilder.bind(noticeQueue())
                .to(topicExchange())
                .with(noticeRoutingKey);
    }
}
